#include <vector>
#include <string>
using namespace std;


class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //映射0 ~ 127 ascii码
        char match[128] = {0};
        int right = 0, left = 0, retlen = 0;
        for(right = 0, left = 0; right < s.size(); ++right){
            //1.入窗口
            int right_index = s[right];
            match[right_index]++;
            
            //但是，入窗口很可能是有重复的，所以，只要窗口内有重复，就一直处理！
            //前提是，保证如窗口前，本身窗口内是合法的！
            while(match[right_index] > 1){
                //进来就说明碰到重复的了，而且一定是刚刚加进来的！
                
                //调整字串长度
                retlen = (right - left) > retlen ? right - left : retlen;

                //调整窗口
                int left_index = s[left];
                match[left_index]--;
                ++left;
            }
        }
        //有可能后序一直没重复，就越界了！所以还需要再处理一次
        return std::max(retlen, right - left);
    }
};